package lambdademo;
//  变量捕捉
//  Lambda在集合当中的使用


import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

class Test {
    public void func() {
        System.out.println("func()");
    }
}







public class VariableCapture {
//    匿名内部类的变量捕获
    public static void main1(String[] args) {
        int a = 100;
//        a = 99;
//        匿名内部类 捕获变量 外部不能被修改 不然内部a会报错
        new Test(){
            public void func() {
                System.out.println("我是内部类 且重写了func这个方法");
                System.out.println("捕获变量(要么是常量 要么未发生改变过)："+a);
            }
        }.func();
//        打印
//        我是内部类 且重写了func这个方法
//        捕获变量(要么是常量 要么未发生改变过)：100
    }




//    Lambda的变量捕获
    public static void main2(String[] args) {
        int a = 10;
//        可以调用NoParameterNoReturn 在同一个包下
        NoParameterNoReturn noParameterNoReturn = ()->{
            // a = 99; error   编译错误
            System.out.println("捕获变量："+a);
        };
        noParameterNoReturn.test();
    }




//Lambda在集合当中的使用


//    Collection接口 forEach()方法演示
    public static void main3(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("zello");
        list.add("cat");
        list.add("hello");
        list.add("lambda");

        list.forEach(new Consumer<String>(){
            @Override
            public void accept(String str){
                //简单遍历集合中的元素。
                System.out.print(str+" ");
//                zello cat hello lambda
            }
        });

//          上面list.forEach代码的简写
//        list.forEach(str->System.out.print(str+" "));
//        Hello cat hello lambda


        list.sort((o1,o2)->o1.compareTo(o2));

        /*
        list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        */

        System.out.println("===========");
        list.forEach(str->System.out.print(str+" "));
//        cat hello lambda zello

    }



//    map
    public static void main(String[] args) {
        HashMap<Integer,String> map = new HashMap<>();
        map.put(1,"zello");
        map.put(2,"cat");
        map.put(3,"hello");
        map.put(4,"lambda");

        map.forEach((key,value)-> System.out.println("key:"+key+" value:"+value));
//        打印
//        key:1 value:zello
//        key:2 value:cat
//        key:3 value:hello
//        key:4 value:lambda


        map.forEach(new BiConsumer<Integer, String>() {
            @Override
            public void accept(Integer integer, String s) {
                System.out.println("key:"+integer+" value:"+s);
            }
        });
//        打印
//        key:1 value:zello
//        key:2 value:cat
//        key:3 value:hello
//        key:4 value:lambda
    }
}
